#ifndef STRUCTWIDGET_H
#define STRUCTWIDGET_H


#include "ui_structbd.h"

#include "stage1.h"
#include "stage2.h"
#include "stage3.h"
#include "propdelegate.h"
#include "umsdatabase.h"
#include <QDomDocument>

const QString STRUCT_PROJ_FILENAME_FILTER = QObject::tr("UMS STRUCT PROJECT (*.upro);;XML (*.xml)");
class StructWidget: public QWidget,Ui::Structbd
{
		Q_OBJECT
		Stage1 *_stage1;
		Stage2 *_stage2;
		Stage3 *_stage3;
		int _current_property_type;
		Attribute *_currentAttr;
		QTreeWidgetItem *_currentItem;
		QString _currentFileName;
		void clear();
		void loadStruct(const QDomElement &root);
		void loadDatabaseProps(const QDomElement &root);
		
	
		void addProperty(const QString &name,const QString &value,int type=PROP_TEXT, const QStringList &xvalues=QStringList());
		void clearProperties();
		void showAttributeProperties(Attribute *attr);
	
		QString databaseName(); //< физическое имя базы данных.
		QDomDocument serverFormat();
		UMSDatabase *_dbase;
		void saveInFile(const QString &fname);
		void setCurrentFileName(const QString &fname);
		void checkSendAvaliable(); //< проверяет на доступность кнопку "Послать"
		int gipercubesCount(); //< количество гиперкубов в БД.
		QDomElement convertFromServerFormat(const QDomElement &ums);
		int getAttributeList(const QDomElement &root,QDomElement *list,int order);
		QDomElement createTextElement(const QString &teg,const QString &value);
		bool hasAttribute(const QDomElement *list,const QDomElement *xattr);
		void convertDomainAttributes(const QDomElement &xroot,const QDomElement &stage1);
		int attributeOrder(const QString &name,const QDomElement &stage1);
	public:
		StructWidget();
		void loadFromFile(const QString &fname); //< загружает проект из файла.
		void loadFromServer(const QString &dbname); //< загружает проект из файла.
		void setDatabase(UMSDatabase *db);
		QString databaseAlias(); //< логическое имя базы данных.
	private slots:
		void attrSelected( const QModelIndex & current, const QModelIndex & previous );
		void cubeOrAttrSelected(const QModelIndex &current,const QModelIndex&);
		void save();
		void propChanged(const QString &value);
		void dataUpdated();
		void on_pbSend_clicked();
		void on_pbSaveAs_clicked();
	signals:
		void saved();
		void openBase(const QString &dbname);
};
	
#endif
